package com.mindskip.xzs.utility;
//用于处理JSON数据在前后端之间的序列化和反序列化操作。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 使用Jackson ObjectMapper处理JSON序列化和反序列化的实用类。
 */
public class JsonUtil {
    private static final ObjectMapper MAPPER = new ObjectMapper(); // Jackson ObjectMapper实例
    private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class); // 用于记录错误的日志

    // 配置ObjectMapper在反序列化过程中忽略未知属性
    static {
        MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    /**
     * 将对象序列化为JSON字符串。
     *
     * @param o 要序列化的对象
     * @param <T> 对象的类型
     * @return 对象的JSON表示
     */
    public static <T> String toJsonStr(T o) {
        try {
            return MAPPER.writeValueAsString(o); // 将对象序列化为JSON字符串
        } catch (JsonProcessingException e) {
            logger.error(e.getMessage(), e); // 记录错误日志
        }
        return null;
    }

    /**
     * 将JSON字符串反序列化为对象。
     *
     * @param json JSON字符串
     * @param valueType 目标对象的类型
     * @param <T> 目标对象的类型
     * @return 反序列化后的对象
     */
    public static <T> T toJsonObject(String json, Class<T> valueType) {
        try {
            return MAPPER.readValue(json, valueType); // 将JSON字符串反序列化为对象
        } catch (IOException e) {
            logger.error(e.getMessage(), e); // 记录错误日志
        }
        return null;
    }

    /**
     * 将JSON字符串反序列化为对象列表。
     *
     * @param json JSON字符串
     * @param valueType 列表中对象的类型
     * @param <T> 列表中对象的类型
     * @return 反序列化后的对象列表
     */
    public static <T> List<T> toJsonListObject(String json, Class<T> valueType) {
        try {
            JavaType getCollectionType = MAPPER.getTypeFactory().constructParametricType(List.class, valueType);
            return MAPPER.readValue(json, getCollectionType);
        } catch (IOException e) {
            logger.error(e.getMessage(), e); // 记录错误日志
        }
        return null;
    }

    /**
     * 将输入流中的数据反序列化为对象。
     *
     * @param stream 输入流
     * @param valueType 目标对象的类型
     * @param <T> 目标对象的类型
     * @return 反序列化后的对象
     */
    public static <T> T toJsonObject(InputStream stream, Class<T> valueType) {
        try {
            return MAPPER.readValue(stream, valueType);
        } catch (IOException e) {
            logger.error(e.getMessage(), e); // 记录错误日志
        }
        return null;
    }
}
